package com.ruoyi.system.service.impl;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.domain.SysRoleUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.dao.SysRoleUserDAO;
import com.ruoyi.system.service.ISysRoleUserService;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.transaction.annotation.Transactional;

import javax.persistence.criteria.Predicate;

/**
 * 用户和角色关联Service业务层处理
 *
 * @author youde
 * @date 2022-11-16
 */
@Service
public class SysRoleUserServiceImpl implements ISysRoleUserService {
    @Autowired
    private SysRoleUserDAO SysRoleUserDAO;


    /**
     * 查询用户和角色关联
     *
     * @param roleUserID ID
     * @return 用户和角色关联
     */
    @Override
    public SysRoleUser selectSysRoleUserByRoleUserId(String roleUserID) {
        return SysRoleUserDAO.findById(roleUserID).orElse(null);
    }

    /**
     * 查询用户和角色关联列表
     *
     * @param SysRoleUser 用户和角色关联
     * @return 用户和角色关联
     */
    @Override
    public Page<SysRoleUser> selectSysRoleUserList(SysRoleUser SysRoleUser, Pageable pageinfo) {
        return SysRoleUserDAO.findAll(getSpecification(SysRoleUser), pageinfo);
    }

    /**
     * 查询用户和角色关联列表
     *
     * @param SysRoleUser 用户和角色关联
     * @return 用户和角色关联
     */
    @Override
    public List<SysRoleUser> selectSysRoleUserList(SysRoleUser SysRoleUser) {
        return SysRoleUserDAO.findAll(getSpecification(SysRoleUser));
    }


    private Specification<SysRoleUser> getSpecification(SysRoleUser SysRoleUser) {
        return (root, criteriaQuery, criteriaBuilder) -> {
            List<Predicate> predicateList = new ArrayList<>();
            if (!StringUtils.isNull(SysRoleUser.getUserId())) {
                predicateList.add(criteriaBuilder.equal(root.get("userId"), SysRoleUser.getUserId()));
            }
            if (!StringUtils.isNull(SysRoleUser.getRoleId())) {
                predicateList.add(criteriaBuilder.equal(root.get("roleId"), SysRoleUser.getRoleId()));
            }
            if (!StringUtils.isNull(SysRoleUser.getpkRoleUser())) {
                predicateList.add(criteriaBuilder.equal(root.get("pkRoleUser"), SysRoleUser.getpkRoleUser()));
            }
            if (!StringUtils.isEmpty(SysRoleUser.getCreateBy())) {
                predicateList.add(criteriaBuilder.equal(root.get("createBy"), SysRoleUser.getCreateBy()));
            }
            if (!StringUtils.isNull(SysRoleUser.getCreateTime())) {
                predicateList.add(criteriaBuilder.equal(root.get("createTime"), SysRoleUser.getCreateTime()));
            }
            if (!StringUtils.isEmpty(SysRoleUser.getRemark())) {
                predicateList.add(criteriaBuilder.equal(root.get("remark"), SysRoleUser.getRemark()));
            }
            if (!StringUtils.isEmpty(SysRoleUser.getUpdateBy())) {
                predicateList.add(criteriaBuilder.equal(root.get("updateBy"), SysRoleUser.getUpdateBy()));
            }
            if (!StringUtils.isNull(SysRoleUser.getUpdateTime())) {
                predicateList.add(criteriaBuilder.equal(root.get("updateTime"), SysRoleUser.getUpdateTime()));
            }
            Predicate[] p = new Predicate[predicateList.size()];
            return criteriaBuilder.and(predicateList.toArray(p));
        };

    }

    /**
     * 新增用户和角色关联
     *
     * @param sysRoleUser 用户和角色关联
     * @return 结果
     */
    @Transactional
    @Override
    public SysRoleUser[] insertSysRoleUser(SysRoleUser[] sysRoleUser) {
        if(StringUtils.isNotEmpty(sysRoleUser)){
            SysRoleUserDAO.deleteByRoleId(sysRoleUser[0].getRoleId());
            return SysRoleUserDAO.saveAll(Arrays.asList(sysRoleUser)).toArray(new SysRoleUser[0]);
        }
       return null;
    }

    /**
     * 修改用户和角色关联
     *
     * @param SysRoleUser 用户和角色关联
     * @return 结果
     */
    @Override
    public SysRoleUser updateSysRoleUser(SysRoleUser SysRoleUser) {
        return SysRoleUserDAO.save(SysRoleUser);
    }

    /**
     * 批量删除用户和角色关联
     *
     * @param pkRoleUsers 需要删除的用户和角色关联主键
     * @return 结果
     */
    @Override
    @Transactional
    public void deleteSysRoleUserByIds(String[] pkRoleUsers) {
        SysRoleUserDAO.deleteAllById(Arrays.asList(pkRoleUsers));
    }

    /**
     * 根据角色删除所有关联信息
     *
     * @param roleId
     * @return
     */
    @Transactional
    @Override
    public int deleteSysRoleUserByRoleId(String roleId) {
        return SysRoleUserDAO.deleteByRoleId(roleId);
    }

    /**
     * 根据角色查询已经分配的用户信息
     *
     * @param roleId
     * @return
     */
    @Override
    public List<SysRoleUser> findByRoleId(String roleId) {
        return SysRoleUserDAO.findByRoleId(roleId);
    }

    @Override
    public int deleteByRoleId(String roleId) {
        return SysRoleUserDAO.deleteByRoleId(roleId);
    }
}